package fr.uniscol.siecle.parsers;

import java.security.Provider.Service;
import java.util.Iterator;

import org.jdom2.Document;
import org.jdom2.Element;

import fr.uniscol.siecle.model.Civilite;
import fr.uniscol.siecle.model.Discipline;
import fr.uniscol.siecle.model.Division;
import fr.uniscol.siecle.model.FichierSIECLE;
import fr.uniscol.siecle.model.FichierSTS;
import fr.uniscol.siecle.model.Groupe;
import fr.uniscol.siecle.model.Individu;
import fr.uniscol.siecle.model.MEF;
import fr.uniscol.siecle.model.Matiere;
import fr.uniscol.siecle.model.ModaliteCours;
import fr.uniscol.siecle.model.Nomenclatures;
import fr.uniscol.siecle.model.ProfesseurPrincipal;
import fr.uniscol.siecle.model.ServiceSTS;

public class FichierSIECLESTSParser extends IFichierSIECLEParser {

	@Override
	public FichierSIECLE buildModel(Document doc, ParsingResults results) {
		
		FichierSTS model = new FichierSTS();
		
		Element eNomenclatures = doc.getRootElement().getChild("NOMENCLATURES");
		Element eDonnees = doc.getRootElement().getChild("DONNEES");
		
		Iterator<Element> ite = eDonnees.getChild("INDIVIDUS").getChildren().iterator();
		
		Element eInd = null;
		Individu ind = null;
		
		while(ite.hasNext()){
			eInd = ite.next();
			
			ind = new Individu();
			ind.setId(eInd.getAttributeValue("ID"));
			ind.setType(eInd.getAttributeValue("TYPE"));
			ind.setSexe(eInd.getChildText("SEXE"));
			ind.setCivilite(new Civilite());
			ind.getCivilite().setCode(eInd.getChildText("CIVILITE"));
			ind.setNom_usage(eInd.getChildText("NOM_USAGE"));
			ind.setNom_patronymique(eInd.getChildText("NOM_PATRONYMIQUE"));
			ind.setPrenom(eInd.getChildText("PRENOM"));
			ind.setDate_naissance(eInd.getChildText("DATE_NAISSANCE"));
			ind.setGrade(eInd.getChildText("GRADE"));
			ind.setFonction(eInd.getChildText("FONCTION"));
			
			if(eInd.getChild("PROFS_PRINC") != null){
				for(Element pr : eInd.getChild("PROFS_PRINC").getChildren()){
					
					ProfesseurPrincipal pp = new ProfesseurPrincipal();
					pp.setIndividu(ind);
					pp.setStructure(new Division());
					pp.getStructure().setCode(pr.getChildText("CODE_STRUCTURE"));
					pp.setDate_debut(pr.getChildText("DATE_DEBUT"));
					pp.setDate_fin(pr.getChildText("DATE_FIN"));
					
					ind.getProfesseursPrincipal().add(pp);
				}
			}
			
			if(eInd.getChild("DISCIPLINES") != null){
				for(Element d : eInd.getChild("DISCIPLINES").getChildren()){
					
					Discipline ds = new Discipline();
					ds.setCode(d.getAttributeValue("CODE"));
					ds.setLibelle_court(d.getChildText("LIBELLE_COURT"));
					ds.setNb_heures(d.getChildText("NB_HEURES"));
					
					ind.getDisciplines().add(ds);
				}
			}
			
			model.getIndividus().add(ind);
		}
		
		ite = eDonnees.getChild("STRUCTURE").getChild("DIVISIONS").getChildren().iterator();
		Element eSt = null;
		Division div = null;
		while(ite.hasNext()){
			eSt = ite.next();
			
			div = new Division();
			div.setCode(eSt.getAttributeValue("CODE"));
			div.setLibelle_long(eSt.getChildText("LIBELLE_LONG"));
			div.setEffectif_prevu(eSt.getChildText("EFFECTIF_PREVU"));
			div.setEffectif_calcule(eSt.getChildText("EFFECTIF_CALCULE"));
			
			for(Element eMef : eSt.getChild("MEFS_APPARTENANCE").getChildren()){
				MEF mef = new MEF();
				mef.setCode(eMef.getAttributeValue("CODE"));
				
				div.getMefsAppartenance().add(mef);
			}
			for(Element eSer : eSt.getChild("SERVICES").getChildren()){
				ServiceSTS ser = new ServiceSTS();
				ser.setStructure(div);
				ser.setMatiere(new Matiere());
				ser.getMatiere().setCode(eSer.getAttributeValue("CODE_MATIERE"));
				ser.setModaliteCours(new ModaliteCours());
				ser.getModaliteCours().setCode(eSer.getAttributeValue("CODE_MOD_COURS"));
				ser.setCo_ens(eSer.getChildText("CO_ENS"));
				ser.setHeures_structure(eSer.getChildText("HEURES_STRUCTURE"));
				
				for(Element ee : eSer.getChild("ENSEIGNANTS").getChildren()){
					ser.getEnseignants().add(model.findIndividu(ee.getAttributeValue("ID")));
				}
				
				div.getServices().add(ser);
			}
			
			model.getStructures().add(div);
		}
		
		ite = eDonnees.getChild("STRUCTURE").getChild("GROUPES").getChildren().iterator();
		Groupe gp = null;
		while(ite.hasNext()){
			eSt = ite.next();
			
			gp = new Groupe();
			gp.setCode(eSt.getAttributeValue("CODE"));
			gp.setLibelle_long(eSt.getChildText("LIBELLE_LONG"));
			gp.setEffectif_prevu(eSt.getChildText("EFFECTIF_PREVU"));
			gp.setEffectif_calcule(eSt.getChildText("EFFECTIF_CALCULE"));
			
			for(Element eMef : eSt.getChild("MEFS_APPARTENANCE").getChildren()){
				MEF mef = new MEF();
				mef.setCode(eMef.getAttributeValue("CODE"));
				
				gp.getMefsAppartenance().add(mef);
			}
			for(Element eSer : eSt.getChild("SERVICES").getChildren()){
				ServiceSTS ser = new ServiceSTS();
				ser.setStructure(gp);
				ser.setMatiere(new Matiere());
				ser.getMatiere().setCode(eSer.getAttributeValue("CODE_MATIERE"));
				ser.setModaliteCours(new ModaliteCours());
				ser.getModaliteCours().setCode(eSer.getAttributeValue("CODE_MOD_COURS"));
				ser.setCo_ens(eSer.getChildText("CO_ENS"));
				ser.setHeures_structure(eSer.getChildText("HEURES_STRUCTURE"));
				
				for(Element ee : eSer.getChild("ENSEIGNANTS").getChildren()){
					ser.getEnseignants().add(model.findIndividu(ee.getAttributeValue("ID")));
				}
				
				gp.getServices().add(ser);
			}
			
			model.getStructures().add(gp);
		}
		
		return model;
	}
}
